<?php
/*
 * description：
 * author：wh
 * email：
 * createTime：{2021/08/24} {10:18} 
 */

namespace wanghua\general_utility_tools_php\wechat;


use Omnipay\Omnipay;
use think\Exception;
use wanghua\general_utility_tools_php\tool\Tools;
use Yurun\PaySDK\Weixin\Params\PublicParams;

/**
 * 微信支付逻辑
 * Class WechatPayLogic
 * @package app\index\logic
 */
class WechatPayLogic
{

    /**
     * desc：调起h5支付
     *
     * composer包依赖: omnipay/common
     *
     * 其它工具包：wanghua/general-utility-tools-php
     *
     * author：wh
     * @param array $config 微信支付配置
     * @param array $order_info 订单信息
     * @param string $notify_url 回调通知URL
     * @return string 返回支付字符串，输出到浏览器进行支付
     */
    function h5pay(array $config, array $order_info, string $notify_url){

        $gateway = Omnipay::create('WechatPay_Mweb');
        $gateway->setAppId($config['app_id']);

        $gateway->setMchId(trim($config['mch_id']));
        $gateway->setApiKey($config['api_key']);

        $order_param = [
            'body'              => $order_info['goods_name'],
            'out_trade_no'      => $order_info['orderid'],
            'total_fee'         => Tools::money_yuan_to_cent($order_info['goods_price']), //=0.01  单位分
            'spbill_create_ip'  => request()->ip(),
            'fee_type'          => 'CNY',
            'notify_url'        => $notify_url,
            'trade_type'        => 'MWEB',
            'nonce_str'         => Tools::rand_str(),
        ];

        $request  = $gateway->purchase($order_param);

        $response = $request->send();

        $res_data = $response->getData();

        if($res_data['return_code'] != 'SUCCESS'){
            return '支付错误';
        }

        if($res_data['result_code'] != 'SUCCESS'){
            return '支付出错了';
        }


        $mweb_url = $res_data['mweb_url'];
        $pay_str = <<<EOF
<html><body><script type="text/javascript">location.href="{$mweb_url}"</script></body></html>
EOF;

        return $pay_str;

    }

    /**
     * desc：微信jsapi支付
     *
     * 场景：微信内的网页支付
     *
     * composer包依赖：请安装[ yurunsoft/pay-sdk ]，附带自动安装yurunsoft/yurun-http包
     * 其它工具包：wanghua/general-utility-tools-php
     *
     * author：wh
     * @param array $config 微信支付的配置 必须参数：appid、mch_id、api_key
     * @param array $wx_user_info 微信用户信息 必须参数：openid
     * @param array $order_info 订单信息 必须参数：goods_name、orderid、goods_price(元)
     * @param string $notify_url 回调URL
     * @return false|string
     * @throws Exception
     */
    function jsapiPay(array $config, array $wx_user_info, array $order_info, string $notify_url){
        // 配置参数
        $params = new PublicParams();
        $params->appID = $config['appid']; // 支付平台分配给开发者的应用ID
        $params->mch_id = $config['mch_id']; // 微信支付分配的商户号
        $params->key = $config['api_key']; // API 密钥
        // 如需使用敏感接口（如退款、发送红包等）需要配置 API 证书路径(登录商户平台下载 API 证书)
        // $params->certPath = 'path/cert.pem'; // XXX: 绝对路径！！！
        // $params->keyPath = 'path/key';      // XXX: 绝对路径！！！！
        // 如果是子服务商需要配置
        // $params->sub_appid = ''; // 微信分配的子商户公众账号ID，服务商、银行服务商需要。
        // $params-> sub_mch_id  = ''; // 微信支付分配的子商户号，开发者模式下必填，服务商、银行服务商需要。
        // SDK实例化，传入公共配置
        $pay = new \Yurun\PaySDK\Weixin\SDK($params);
        // 支付接口（生成支付订单）
        $request = new \Yurun\PaySDK\Weixin\JSAPI\Params\Pay\Request;
        $request->body = $order_info['goods_name']; // 商品描述
        $request->out_trade_no = $order_info['orderid']; // 订单号
        $request->total_fee = Tools::money_yuan_to_cent($order_info['goods_price']); // 订单总金额，单位为：分
        $request->spbill_create_ip = request()->ip(); // 客户端ip
        $request->notify_url = $notify_url; // 异步通知地址
        $request->openid = $wx_user_info['openid']; // 必须设置openid
        // 调用接口
        $result = $pay->execute($request);
        //此调试代码禁止删除
        //var_dump('result:', $result);
        //var_dump('success:', $pay->checkResult());
        //var_dump('error:', $pay->getError(), 'error_code:', $pay->getErrorCode());
        if(!$pay->checkResult()){
            throw new Exception('下单错误.'.$pay->getError());
        }

        $request = new \Yurun\PaySDK\Weixin\JSAPI\Params\JSParams\Request;
        $request->prepay_id = $result['prepay_id'];
        $jsapiParams = $pay->execute($request);
        // 最后需要将数据传给js，使用WeixinJSBridge进行支付
        return json_encode($jsapiParams);
    }
}